AtomicLong হল Java এর java.util.concurrent.atomic প্যাকেজের একটি ক্লাস, যা atomic operations এর মাধ্যমে একটি long টাইপের ভ্যালুতে কাজ করে। এটি Thread-safe এবং non-blocking অপারেশন করতে পারে, যার মানে হল একাধিক থ্রেড একই সময়ে কাজ করলেও ডেটার সঠিকতা (Consistency) বজায় থাকে।
AtomicLong এর বৈশিষ্ট্য
- Atomicity (অখণ্ডতা): AtomicLong এর অপারেশনগুলো atomic হয়, অর্থাৎ অপারেশনটি বিভক্ত হয় না বা অংশত সম্পন্ন হয় না।
- Thread-Safe: একাধিক থ্রেড যখন একযোগে AtomicLong অবজেক্টে কাজ করে, তখন এটি কোনো synchronization block বা lock ছাড়াই ডেটার সঠিকতা নিশ্চিত করে।
- Non-blocking: এটি লক-ভিত্তিক মেকানিজমের পরিবর্তে CAS (Compare-And-Swap) ব্যবহার করে, যা Deadlock এবং Livelock এর ঝুঁকি কমায়।
- High Performance: Traditional synchronization method এর চেয়ে দ্রুত।
AtomicLong কেন প্রয়োজন?
মাল্টি-থ্রেডেড প্রোগ্রামিংয়ে, একাধিক থ্রেড একসঙ্গে একটি ভ্যারিয়েবল ম্যানিপুলেট করতে চায়। যেমন একটি counter বাড়ানো বা কমানো। সাধারণ long ভ্যারিয়েবলে কাজ করার সময় Race Condition হতে পারে, যা inconsistent result দেয়।
AtomicLong ব্যবহার করে এই সমস্যার সমাধান করা যায়, কারণ এটি atomic operations সরবরাহ করে, যেমন:
- incrementAndGet()
- getAndIncrement()
- compareAndSet()
- addAndGet()
AtomicLong কিভাবে কাজ করে?
AtomicLong মূলত Compare-And-Swap (CAS) মেকানিজম ব্যবহার করে। এটি তিনটি ধাপ অনুসরণ করে:
- বর্তমান মান পড়া।
- নতুন মান গণনা করা।
- বর্তমান মানটি প্রত্যাশিত মানের সাথে মিললে নতুন মান সেট করা।
যদি মানটি প্রত্যাশিত না হয়, তবে অপারেশনটি পুনরাবৃত্তি হয় যতক্ষণ না এটি সফল হয়।
AtomicLong ক্লাসের গুরুত্বপূর্ণ মেথড
- get(): বর্তমান মান রিটার্ন করে।
- set(long newValue): একটি নতুন মান সেট করে।
- incrementAndGet(): মান ১ বাড়িয়ে নতুন মান রিটার্ন করে।
- getAndIncrement(): বর্তমান মান রিটার্ন করে এবং তারপর ১ বাড়ায়।
- compareAndSet(long expectedValue, long newValue): যদি বর্তমান মান expectedValue হয়, তবে এটি newValue এ আপডেট হয় এবং সফল হলে true রিটার্ন করে।
- addAndGet(long delta): নির্দিষ্ট মান delta যোগ করে নতুন মান রিটার্ন করে।
উদাহরণ: AtomicLong এর ব্যবহার
import java.util.concurrent.atomic.AtomicLong;
public class AtomicLongExample {
public static void main(String[] args) {
// AtomicLong অবজেক্ট তৈরি
AtomicLong atomicLong = new AtomicLong(100);
// বর্তমান মান রিড
System.out.println("Initial Value: " + atomicLong.get()); // আউটপুট: 100
// মান ১ বাড়ানো
long incrementedValue = atomicLong.incrementAndGet();
System.out.println("After Increment: " + incrementedValue); // আউটপুট: 101
// নির্দিষ্ট মান যোগ করা
long addedValue = atomicLong.addAndGet(50);
System.out.println("After Adding 50: " + addedValue); // আউটপুট: 151
// Compare-And-Set
boolean isUpdated = atomicLong.compareAndSet(151, 200);
System.out.println("Compare-And-Set Success: " + isUpdated); // আউটপুট: true
System.out.println("Updated Value: " + atomicLong.get()); // আউটপুট: 200
}
}
AtomicLong এর সুবিধা
- Concurrency Management: মাল্টি-থ্রেডেড অ্যাপ্লিকেশন ডেভেলপমেন্টে ডেটা সঠিকতা বজায় রাখে।
- High Performance: Traditional locking mechanisms এর চেয়ে দ্রুত কাজ করে।
- Simpler Code: Synchronization block বা lock ব্যবহারের প্রয়োজন হয় না।
- Safe Operations: Race condition এবং inconsistent data এড়ানো যায়।
AtomicLong এর সীমাবদ্ধতা
- CAS Overhead: Compare-And-Swap অপারেশন পুনরাবৃত্তি করলে পারফরম্যান্স কিছুটা প্রভাবিত হতে পারে।
- Complex Scenarios: জটিল লজিকের জন্য অতিরিক্ত synchronization প্রয়োজন হতে পারে।
- Single Variable Scope: এটি শুধুমাত্র একক long টাইপের ডেটার উপর কাজ করতে পারে।
AtomicLong হল মাল্টি-থ্রেডেড প্রোগ্রামিংয়ে Thread-safe increment/decrement counters এবং অন্যান্য atomic operations পরিচালনার জন্য একটি আদর্শ সমাধান। এটি বিশেষ করে উচ্চ-পারফরম্যান্স অ্যাপ্লিকেশন, যেমন logging systems, counters, এবং multi-threaded utilities তৈরিতে ব্যবহৃত হয়।